home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
cocktail
/
lalr.lha
/
lalr
/
src
/
ArgCheck.mi
< prev
next >
Wrap
Text File
|
1992-08-18
|
10KB
|
384 lines
(* check arguments *)
(* $Id: ArgCheck.mi,v 2.4 1992/08/07 15:22:49 grosch rel $ *)
(* $Log: ArgCheck.mi,v $
* Revision 2.4 1992/08/07 15:22:49 grosch
* allow several scanner and parsers; extend module Errors
*
* Revision 2.3 1992/01/30 14:08:30 grosch
* redesign of interface to operating system
*
* Revision 2.2 1991/11/21 14:53:14 grosch
* new version of RCS on SPARC
*
* Revision 2.1 91/10/09 09:05:14 grosch
* renamed NULL in DevNull for C compatibility
*
* Revision 2.0 91/03/08 18:31:31 grosch
* turned tables into initialized arrays (in C)
* moved mapping tokens -> strings from Errors to Parser
* changed interface for source position
*
* Revision 1.5 90/06/12 16:53:33 grosch
* renamed main program to lalr, added { } for actions, layout improvements
*
* Revision 1.4 89/10/18 19:41:33 grosch
* renamed ScanTab and ParsTab to Scan.Tab and Pars.Tab because of PCTE
*
* Revision 1.3 89/05/02 14:33:06 vielsack
* new option: -v
*
* Revision 1.2 89/02/24 14:06:52 vielsack
* call BeginFile
*
* Revision 1.1 89/01/12 18:10:34 vielsack
* supply source file name
*
* Revision 1.0 88/10/04 14:35:47 vielsack
* Initial revision
*
*)
IMPLEMENTATION MODULE ArgCheck;
FROM Actions IMPORT ScannerName, ParserName;
FROM Character IMPORT IsEqual, Assign;
FROM Check IMPORT Verbose;
FROM Checks IMPORT CheckReadOpen, CheckWriteOpen;
FROM Debug IMPORT NoTrace;
FROM Default IMPORT NoDefault;
FROM Errors IMPORT eError, eString,
ErrorMessageI, tReportMode, SetReportMode,
CloseErrors;
FROM Gen IMPORT CaseFlag, CaseLabels;
FROM Idents IMPORT tIdent, NoIdent, WriteIdent, GetString;
FROM IO IMPORT tFile, StdInput, StdOutput,
ReadOpen, WriteOpen, ReadClose,
WriteClose, EndOfFile, CloseIO,
WriteS, WriteC, WriteNl;
FROM Listing IMPORT SourceFile;
FROM Path IMPORT InsertPath;
FROM Parser IMPORT ParsTabName;
FROM Scanner IMPORT ScanTabName, BeginFile;
FROM Positions IMPORT NoPosition;
FROM Strings IMPORT tString, tStringIndex, ArrayToString,
StringToArray, SubString, Char,
Concatenate, Length, ReadL,
WriteL, StringToInt, Append;
FROM SysError IMPORT StatIsBad, SysErrorMessageI;
FROM System IMPORT GetArgument, GetArgCount;
FROM SYSTEM IMPORT ADR;
FROM WriteTok IMPORT tLanguage, Language, SourceFileName;
CONST
eToManyArgs = 21;
eNoOption = 20;
DevNull = '/dev/null';
Drv = 'Drv';
ExtDefM = '.md';
ExtImpM = '.mi';
ExtDefC = '.h';
ExtImpC = '.c';
ScanDefM = 'Scanner.md';
ScanImpM = 'Scanner.mi';
ErrDefM = 'Errors.md';
ErrImpM = 'Errors.mi';
ParsDefM = 'Parser.md';
ParsImpM = 'Parser.mi';
ParsDrvM = 'ParserDrv.mi';
ScanDefC = 'Scanner.h';
ScanImpC = 'Scanner.c';
ErrDefC = 'Errors.h';
ErrImpC = 'Errors.c';
ParsDefC = 'Parser.h';
ParsImpC = 'Parser.c';
ParsDrvC = 'ParserDrv.c';
HelpFile = 'lalr.cat';
ShortHelpFile = 'lalr.syn';
cHelp = '-h';
cC = '-c';
cModula = '-m';
cDefinition = '-d';
cErrors = '-e';
cLong = '-l';
cImmediate = '-i';
cScan = '-s';
cParsDrv = '-p';
cAll = '-a';
cCase = '-cs';
cVerbose = '-v';
cLine = '-g';
cNoTrace = '-NoTrace';
cNoDefault = '-NoDefault';
cTest = '-t';
VAR MakeDef, MakeErr, MakeScan, MakeParsDrv: BOOLEAN;
PROCEDURE ArgCheck;
VAR
ArgNo : CARDINAL;
Argument : ARRAY [0..255] OF CHAR;
ArgString : tString;
file : tFile;
FileName : ARRAY [0..255] OF CHAR;
SourceFileIsOpen : BOOLEAN;
BEGIN
SourceFileIsOpen := FALSE;
InsertPath (ScanTabName);
InsertPath (ParsTabName);
MakeDef := FALSE;
MakeErr := FALSE;
MakeScan := FALSE;
MakeParsDrv := FALSE;
FOR ArgNo := 1 TO GetArgCount () - 1 DO
GetArgument (ArgNo, Argument);
IF (Argument [0] >= '0') & (Argument [0] <= '9') THEN
ArrayToString (Argument, ArgString);
CaseLabels := StringToInt (ArgString);
CaseFlag := TRUE;
ELSIF Argument [0] # '-' THEN
IF SourceFileIsOpen THEN
ArrayToString (Argument, ArgString);
ErrorMessageI (eToManyArgs, eError, NoPosition, eString, ADR (ArgString));
ELSE
Assign (SourceFileName, Argument);
SourceFile := ReadOpen (Argument);
IF StatIsBad (SourceFile) THEN
ArrayToString (Argument, ArgString);
SysErrorMessageI (SourceFile, eError, eString, ADR(ArgString));
SourceFile := StdInput;
ELSE
SourceFileIsOpen := TRUE;
BeginFile (Argument);
END;
END;
ELSIF IsEqual (Argument, cC) THEN
Language := C;
ELSIF IsEqual (Argument, cModula) THEN
Language := Modula2;
ELSIF IsEqual (Argument, cDefinition) THEN
MakeDef := TRUE;
ELSIF IsEqual (Argument, cErrors) THEN
MakeErr := TRUE;
ELSIF IsEqual (Argument, cLong) THEN
SetReportMode (eListing);
ELSIF IsEqual (Argument, cImmediate) THEN
SetReportMode (eImmediate);
ELSIF IsEqual (Argument, cScan) THEN
MakeScan := TRUE;
ELSIF IsEqual (Argument, cParsDrv) THEN
MakeParsDrv := TRUE;
ELSIF IsEqual (Argument, cAll) THEN
MakeErr := TRUE;
MakeDef := TRUE;
MakeParsDrv := TRUE;
MakeScan := TRUE;
ELSIF IsEqual (Argument, cCase) THEN
CaseFlag := TRUE;
ELSIF IsEqual (Argument, cTest) THEN
TEST := TRUE;
ELSIF IsEqual (Argument, cVerbose) THEN
Verbose := TRUE;
ELSIF IsEqual (Argument, cLine) THEN
LineFlag := TRUE;
ELSIF IsEqual (Argument, cNoTrace) THEN
NoTrace := TRUE;
ELSIF IsEqual (Argument, cNoDefault) THEN
NoDefault := TRUE;
ELSIF IsEqual (Argument, cHelp) THEN
FileName := HelpFile;
InsertPath (FileName);
file := ReadOpen (FileName);
IF StatIsBad (file) THEN
ArrayToString (FileName, ArgString);
SysErrorMessageI (file, eError, eString, ADR (ArgString));
ELSE
CopyFile (file, StdOutput);
END;
Generate := FALSE;
RETURN;
ELSE
ArrayToString (Argument, ArgString);
ErrorMessageI (eNoOption, eError, NoPosition, eString, ADR (ArgString));
END;
END;
IF SourceFile = StdInput THEN
FileName := ShortHelpFile;
InsertPath (FileName);
file := ReadOpen (FileName);
IF StatIsBad (file) THEN
ArrayToString (FileName, ArgString);
SysErrorMessageI (file, eError, eString, ADR (ArgString));
ELSE
CopyFile (file, StdOutput);
END;
Generate := FALSE;
RETURN;
END;
END ArgCheck;
PROCEDURE GenerateSupport;
VAR
FileName : ARRAY [0..255] OF CHAR;
ParsDrv,
ParsDef, ParsImp,
ScanDef, ScanImp,
ErrDef, ErrImp : ARRAY [0..255] OF CHAR;
in, out : tFile;
String1, String2 : tString;
BEGIN
IF Language = Modula2 THEN
ParsDrv := ParsDrvM;
ParsDef := ParsDefM;
ParsImp := ParsImpM;
ScanDef := ScanDefM;
ScanImp := ScanImpM;
ErrDef := ErrDefM;
ErrImp := ErrImpM;
ExtDef := ExtDefM;
ExtImp := ExtImpM;
ELSE
ParsDrv := ParsDrvC;
ParsDef := ParsDefC;
ParsImp := ParsImpC;
ScanDef := ScanDefC;
ScanImp := ScanImpC;
ErrDef := ErrDefC;
ErrImp := ErrImpC;
ExtDef := ExtDefC;
ExtImp := ExtImpC;
END;
IF MakeScan THEN
MakeFileName (ScannerName, Scanner, ExtDef, FileName);
out := WriteOpen (FileName); CheckWriteOpen (out, FileName);
InsertPath (ScanDef);
in := ReadOpen (ScanDef); CheckReadOpen (in, ScanDef);
CopyFile (in, out);
WriteClose (out);
ReadClose (in);
MakeFileName (ScannerName, Scanner, ExtImp, FileName);
out := WriteOpen (FileName); CheckWriteOpen (out, FileName);
InsertPath (ScanImp);
in := ReadOpen (ScanImp); CheckReadOpen (in, ScanImp);
CopyFile (in, out);
WriteClose (out);
ReadClose (in);
END;
IF MakeErr THEN
out := WriteOpen (ErrDef); CheckWriteOpen (out, ErrDef);
InsertPath (ErrDef);
in := ReadOpen (ErrDef); CheckReadOpen (in, ErrDef);
CopyFile (in, out);
WriteClose (out);
ReadClose (in);
out := WriteOpen (ErrImp); CheckWriteOpen (out, ErrImp);
InsertPath (ErrImp);
in := ReadOpen (ErrImp); CheckReadOpen (in, ErrImp);
CopyFile (in, out);
WriteClose (out);
ReadClose (in);
END;
IF MakeParsDrv THEN
IF ParserName = NoIdent THEN
ArrayToString (Parser, String1);
ELSE
GetString (ParserName, String1);
END;
ArrayToString (Drv, String2);
Concatenate (String1, String2);
ArrayToString (ExtImp, String2);
Concatenate (String1, String2);
Append (String1, 0C);
StringToArray (String1, FileName);
out := WriteOpen (FileName); CheckWriteOpen (out, FileName);
InsertPath (ParsDrv);
in := ReadOpen (ParsDrv); CheckReadOpen (in, ParsDrv);
CopyFile (in, out);
WriteClose (out);
ReadClose (in);
END;
InsertPath (ParsImp);
Pars := ReadOpen (ParsImp); CheckReadOpen (Pars, ParsImp);
IF MakeDef THEN
InsertPath (ParsDef);
Def := ReadOpen (ParsDef); CheckReadOpen (Def, ParsDef);
ELSE
Def := ReadOpen (DevNull); CheckReadOpen (Def, DevNull);
END;
END GenerateSupport;
PROCEDURE MakeFileName (Name: tIdent; Default, Ext: ARRAY OF CHAR; VAR FileName: ARRAY OF CHAR);
VAR String1, String2 : tString;
BEGIN
IF Name = NoIdent THEN
ArrayToString (Default, String1);
ELSE
GetString (Name, String1);
END;
ArrayToString (Ext, String2);
Concatenate (String1, String2);
Append (String1, 0C);
StringToArray (String1, FileName);
END MakeFileName;
PROCEDURE ExpandLine (Out: tFile; Line: tString);
VAR
Ch : CHAR;
i : CARDINAL;
BEGIN
i := 3;
LOOP
INC (i);
IF i > Length (Line) THEN WriteNl (Out); EXIT; END;
Ch := Char (Line, i);
CASE Ch OF
| '@' : IF ParserName = NoIdent
THEN WriteS (Out, Parser);
ELSE WriteIdent (Out, ParserName); END;
| '$' : IF ScannerName = NoIdent THEN
IF Char (Line, i + 1) = '_'
THEN INC (i);
ELSE WriteS (Out, Scanner);
END;
ELSE WriteIdent (Out, ScannerName); END;
ELSE WriteC (Out, Ch);
END;
END;
END ExpandLine;
PROCEDURE CopyFile (In, Out: tFile);
VAR Line : tString;
BEGIN
WHILE NOT EndOfFile (In) DO
ReadL (In, Line);
IF (Length (Line) >= 2) AND (Char (Line, 1) = '$') AND (Char (Line, 2) = '@') THEN
ExpandLine (Out, Line);
ELSE
WriteL (Out, Line);
END;
END;
END CopyFile;
BEGIN
LineFlag := FALSE;
TEST := FALSE;
Generate := TRUE;
END ArgCheck.